# 简化的Makefile用于构建gRPC双向流示例

# 目录结构
SRC_DIR = src
INCLUDE_DIR = include
BUILD_DIR = build

# 编译器和标志
CXX = g++
CPPFLAGS += `pkg-config --cflags protobuf grpc` -I$(INCLUDE_DIR) -I$(BUILD_DIR)
CXXFLAGS += -std=c++17
LDFLAGS += `pkg-config --libs protobuf grpc++ grpc`

# 工具
PROTOC = protoc
GRPC_CPP_PLUGIN = grpc_cpp_plugin
GRPC_CPP_PLUGIN_PATH ?= `which $(GRPC_CPP_PLUGIN)`

# 源文件和目标文件
PROTO_SRC = $(SRC_DIR)/chat.proto
PROTO_OBJS = $(BUILD_DIR)/chat.pb.o $(BUILD_DIR)/chat.grpc.pb.o
SERVER_OBJ = $(BUILD_DIR)/server.o
CLIENT_OBJ = $(BUILD_DIR)/client.o

# 确保build目录存在
$(BUILD_DIR):
	mkdir -p $(BUILD_DIR)

all: $(BUILD_DIR) $(BUILD_DIR)/chat_server $(BUILD_DIR)/chat_client

$(BUILD_DIR)/chat_server: $(PROTO_OBJS) $(SERVER_OBJ)
	$(CXX) $^ $(LDFLAGS) -o $@

$(BUILD_DIR)/chat_client: $(PROTO_OBJS) $(CLIENT_OBJ)
	$(CXX) $^ $(LDFLAGS) -o $@

# 编译源文件
$(BUILD_DIR)/server.o: $(SRC_DIR)/server.cpp $(BUILD_DIR)/chat.grpc.pb.cc
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

$(BUILD_DIR)/client.o: $(SRC_DIR)/client.cpp $(BUILD_DIR)/chat.grpc.pb.cc
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

# 编译protobuf生成的文件
$(BUILD_DIR)/%.pb.o: $(BUILD_DIR)/%.pb.cc
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

$(BUILD_DIR)/%.grpc.pb.o: $(BUILD_DIR)/%.grpc.pb.cc
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

# 生成protobuf文件
$(BUILD_DIR)/chat.grpc.pb.cc $(BUILD_DIR)/chat.grpc.pb.h: $(PROTO_SRC)
	$(PROTOC) -I $(SRC_DIR) --grpc_out=$(BUILD_DIR) --plugin=protoc-gen-grpc=$(GRPC_CPP_PLUGIN_PATH) $<

$(BUILD_DIR)/chat.pb.cc $(BUILD_DIR)/chat.pb.h: $(PROTO_SRC)
	$(PROTOC) -I $(SRC_DIR) --cpp_out=$(BUILD_DIR) $<

# 复制头文件到include目录
copy-headers: $(BUILD_DIR)/chat.pb.h $(BUILD_DIR)/chat.grpc.pb.h
	cp $(BUILD_DIR)/chat.pb.h $(BUILD_DIR)/chat.grpc.pb.h $(INCLUDE_DIR)/

clean:
	rm -rf $(BUILD_DIR)/*

distclean: clean
	rm -rf $(BUILD_DIR)

.PHONY: all clean distclean copy-headers